# -*-coding: Utf-8 -*-
# @File : admin .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2024/5/7

from interface import AdminInterface
from lib import Tools, decorator, CommonView
from typing import Tuple, Union
from db import School, Course, Admin, Teacher


class AdminView(CommonView):
    def __init__(self):
        super().__init__()
        self.admin_menu = '''
        =====================这里是管理员功能菜单=====================
                                1.注册
                                2.登录
                                3.创建学校
                                4.创建课程
                                5.创建讲师
                                6.学校绑定课程
                                7.修改讲师密码
                                8.查看所有课程信息
                                9.查看所有学校信息
                                10.查看所有讲师信息
                                11.指定讲师授课课程
                                q:退出系统               
        ==========================菜单结束==========================
        '''
        self.admin_dict = {
            1: 'register',
            2: 'login',
            3: 'create_school',
            4: 'create_course',
            5: 'create_teacher',
            6: 'school_add_course',
            7: 'change_teacher_password',
            8: 'show_all_course',
            9: 'show_all_school',
            10: 'check_teacher_course',
            11: 'chose_teacher_course',
        }
        self.interface = AdminInterface()
        self.login_dict = {
            'username': '',
            'role': ""
        }

    def register(self) -> bool:
        '''
        管理员注册视图函数
        :return: 注册标志，注册信息
        '''
        return super().common_register(cls=Admin, role='Admin')

    def login(self) -> bool:
        '''
        管理员登陆视图函数
        :return: 登陆成功失败，登陆信息
        '''
        return super().common_login(cls=Admin, role='Admin', login_dict=self.login_dict)

    @decorator(tag='login')
    @decorator(tag='role')
    def create_school(self) -> bool:
        '''
        管理员创建学校
        :return: 创建成功失败,提示信息
        '''
        # 【零】获取当前登录的管理员用户名
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用创建学校功能!')
        # 【一】获取管理员输入的学校名称
        school_name = input("请输入学校名称 :>>>> ").strip()
        # 【二】获取管理员输入的学校地址
        school_addr = input("请输入学校地址 :>>>> ").strip()
        # 【三】获取管理员输入的学校简介
        school_desc = input("请输入学校简介 :>>>> ").strip()
        # 【四】调用接口层进行创建学校逻辑校验
        flag = self.interface.create_school_interface(username=username, school_name=school_name,
                                                      school_addr=school_addr,
                                                      school_desc=school_desc)
        # 【五】返回前端渲染的信息
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def create_course(self) -> bool:
        '''
        管理员创建课程
        :return: 创建成功失败,提示信息
        '''
        # 【零】获取当前登录的管理员用户名
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用创建课程功能!')
        # 【一】获取管理员输入的课程名称
        course_name = input("请输入课程名称 :>>>> ").strip()
        # 【二】获取管理员输入的课程价格
        course_price = input("请输入课程价格 :>>>> ").strip()
        # 【三】获取管理员输入的课程周期
        course_period = input("请输入课程周期 :>>>> ").strip()
        flag = self.interface.create_course_interface(username=username, course_name=course_name,
                                                      course_price=course_price, course_period=course_period)
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def create_teacher(self) -> bool:
        '''
        管理员创建讲师
        :return: 创建成功失败,提示信息
        '''
        # 【零】获取当前登录的管理员用户名
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用创建讲师功能!')
        # 【一】获取讲师的用户名
        teacher_name = input("请输入讲师的用户名 :>>>> ").strip()
        # 【二】获取讲师的密码
        teacher_password = input("请输入讲师的密码 :>>>> ").strip()
        # 【三】调用接口层进行校验
        flag = self.interface.create_teacher_interface(username=username, teacher_name=teacher_name,
                                                       teacher_password=teacher_password)
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def school_add_course(self) -> bool:
        '''
        管理员学校关联课程
        :return:添加成功失败，提示信息
        '''
        # 【零】获取当前登录的管理员用户名
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用学校开设课程功能!')
        # 【一】获取所有的学校名称
        flag, school_name_dict = School.chose_name()
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'当前管理员查看学校信息失败!原因是无学校存在!')
            return False
        # 【二】获取学校名称
        school_id = input("请输入学校编号 :>>>> ").strip()
        school_obj = school_name_dict.get(school_id)
        # 【三】获取所有课程名称
        flag, course_name_dict = Course.chose_name()
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'当前管理员查看课程信息失败!原因是无课程开设!')
            return False
        # 【二】获取课程名称
        course_id = input("请输入课程编号 :>>>> ").strip()
        course_obj = course_name_dict.get(course_id)
        # 【三】调用接口层进行校验
        flag = self.interface.school_add_course_interface(username=username, school_obj=school_obj,
                                                          course_obj=course_obj)
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def show_all_course(self) -> bool:
        '''
        查看当前注册的所有课程
        :return:
        '''
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用查看当前注册的所有课程功能!')
        flag = self.interface.show_all_course_interface(username=username)
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def show_all_school(self) -> bool:
        '''
        查看当前注册的所有学校
        :return:
        '''
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用查看当前注册的所有学校功能!')
        flag = self.interface.show_all_school_interface(username=username)
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def check_teacher_course(self) -> bool:
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用查看当前讲师教授的课程功能!')
        flag = self.interface.show_teach_course_interface(username=username)
        return flag

    @decorator(tag='login')
    @decorator(tag='role')
    def chose_teacher_course(self) -> bool:
        username = self.login_dict.get('username')
        role_name = self.tools.role_name(role='Admin')
        print(f'欢迎 尊贵的 {role_name} {username} 使用查看当前讲师绑定授课功能!')
        # 【一】获取所有的讲师名单
        flag, teacher_name_dict = Teacher.chose_name()
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'当前管理员查看学校信息失败!原因是无学校存在!')
            return False
        teacher_name_id = input("请输入讲师编号 :>>>> ").strip()
        teacher_obj = teacher_name_dict.get(teacher_name_id)
        # 【二】获取所有的课程名单
        flag, course_name_dict = Course.chose_name()
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'当前管理员查看课程信息失败!原因是无课程存在!')
            return False
        course_name_id = input("请输入课程编号 :>>>> ").strip()
        course_obj = course_name_dict.get(course_name_id)
        # 【三】调用接口层
        flag = self.interface.chose_teacher_course_interface(username=username,
                                                             course_obj=course_obj,
                                                             teacher_obj=teacher_obj)
        return flag
